/**
 *
 * Maple Mini bootloader updater sketch.
 * Based on sketch from Gregwar for Robotis OpenCM9.04, which is based on Maple bootloader code.
 *
 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 * WARNING                                                                 WARNING
 * WARNING  This comes with NO WARRANTY, you use it at your own risk       WARNING
 * WARNING                                                                 WARNING
 * WARNING  Please read this warning text and the instructions below       WARNING
 * WARNING                                                                 WARNING
 * WARNING  Running this sketch will erase your bootloader replace it      WARNING
 * WARNING  with the new STM32duino bootloader                             WARNING
 * WARNING                                                                 WARNING
 * WARNING  Only use this sketch with Maple mini boards.                   WARNING
 * WARNING                                                                 WARNING
 * WARNING  Note. If your bootloader does get messed up, it is possible    WARNING
 * WARNING  to reflash using an external USB to Serial adaptor or another  WARNING
 * WARNING  Arduino board (to act as a USB to Serial device)               WARNING
 * WARNING                                                                 WARNING
 * WARNING  For more information see www.stm32duino.com                    WARNING
 * WARNING                                                                 WARNING
 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 *
 *
 * Instructions.
 *
 * Upload this sketch onto your Maple mini.
 *
 * After upload the LED on the board should start to flash slowly (on for 1 sec off for 1 sec)
 *
 * Open the Serial Monitor and follow the on screen instructions
 *
 * If the version of the bootloader that is contained in this sketch is already installed,
 * a message is displayed and you will not be prompted to update.
 *
 * If prompted to update, press Y to agree and reflash the bootloader
 *
 * After the update has finished, the sketch will wait for you to manually reset the board
 * or to upload a new sketch
 *
 * If you just reset the board. This sketch will run again, as it will not be touched by the bootloader update
 * However it will display the message to indicate that this bootloader has already been installed
 *
 * For support please register to www.stm32duino.com
 *
 * Credit goes to Victor PV, Matthis, Ray.
 *
 * For source code and binaries for the bootloader see
 * www.github.com/rogerclarkmelbourne/stm32duino-bootloader
 *
 * See also www.rogerclark.net
 *
 */

// Data of bootloader
const char maple_mini_boot20[]={
0x00,0x50,0x00,0x20,0xf1,0x00,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0xb5,0x04,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31
,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x31,0x01,0x00,0x08,0x5f,0xf8,0x08,0xf1,0x00,0x21,0x03,0xe0,0x09,0x4b,0x5b,0x58,0x43,0x50,0x04,0x31,0x08,0x48,0x09,0x4b,0x42
,0x18,0x9a,0x42,0xf6,0xd3,0x08,0x4a,0x02,0xe0,0x00,0x23,0x42,0xf8,0x04,0x3b,0x06,0x4b,0x9a,0x42,0xf9,0xd3,0x00,0xf0,0x27,0xfa,0x70,0x47,0x0c,0x19,0x00,0x08,0x00
,0x00,0x00,0x20,0xc8,0x02,0x00,0x20,0xc8,0x02,0x00,0x20,0x0c,0x03,0x00,0x20,0xfe,0xe7,0x03,0x28,0x8c,0xbf,0x02,0x20,0x00,0x20,0x70,0x47,0x03,0x4b,0x1b,0x68,0x9b
,0x7a,0x13,0xb1,0x02,0x4b,0x05,0x22,0x1a,0x60,0x70,0x47,0x04,0x03,0x00,0x20,0x10,0x03,0x00,0x20,0x70,0x47,0x00,0x00,0x01,0x4b,0x04,0x22,0x1a,0x60,0x70,0x47,0x10
,0x03,0x00,0x20,0x10,0xb5,0x00,0xf0,0x6f,0xfc,0x21,0x4b,0x21,0x4a,0x1b,0x68,0x00,0x24,0x12,0x68,0x9c,0x72,0xd2,0x79,0x1f,0x49,0x5a,0x72,0x1f,0x4a,0x0c,0x60,0x13
,0x68,0x20,0x46,0x23,0xf4,0xec,0x43,0x23,0xf0,0x70,0x03,0x43,0xf4,0x00,0x73,0x9b,0xb2,0x13,0x60,0x13,0x68,0x23,0xf4,0xe0,0x43,0x23,0xf0,0x40,0x03,0x9b,0xb2,0x83
,0xf0,0x10,0x03,0x13,0x60,0x0a,0x68,0x15,0x4b,0x92,0xb2,0x13,0x44,0x5b,0x00,0x40,0x22,0x1a,0x60,0x0b,0x68,0x80,0x22,0x9b,0xb2,0x03,0xf1,0x00,0x53,0x03,0xf5,0x40
,0x53,0x5b,0x00,0x1a,0x60,0x00,0xf0,0x2f,0xfe,0x0e,0x4b,0x20,0x46,0x1b,0x68,0x93,0xf8,0x30,0x10,0x00,0xf0,0x58,0xfe,0x20,0x46,0x00,0xf0,0x08,0xfe,0x0a,0x4b,0x01
,0x22,0x20,0x46,0xbd,0xe8,0x10,0x40,0x1a,0x60,0x01,0xf0,0x21,0xbb,0x00,0xbf,0x04,0x03,0x00,0x20,0xb8,0x02,0x00,0x20,0x50,0x5c,0x00,0x40,0x00,0x5c,0x00,0x40,0x04
,0x30,0x00,0x20,0xdc,0x02,0x00,0x20,0x10,0x03,0x00,0x20,0x38,0xb5,0x12,0x4b,0x05,0x46,0x1a,0x68,0x1c,0x46,0x12,0x78,0x02,0xf0,0x7f,0x02,0x21,0x2a,0x19,0xd1,0x00
,0xf0,0xac,0xfc,0xb0,0xb1,0x68,0x1e,0x04,0x28,0x13,0xd8,0xdf,0xe8,0x00,0xf0,0x09,0x05,0x07,0x12,0x03,0x00,0x09,0x4b,0x04,0xe0,0x09,0x4b,0x02,0xe0,0x09,0x4b,0x00
,0xe0,0x09,0x4b,0x22,0x68,0x00,0x24,0x93,0x61,0x54,0x82,0x20,0x46,0x98,0x47,0x20,0x46,0x38,0xbd,0x02,0x20,0x38,0xbd,0x04,0x03,0x00,0x20,0x8d,0x0a,0x00,0x08,0xe5
,0x0a,0x00,0x08,0xa5,0x0a,0x00,0x08,0xbd,0x0a,0x00,0x08,0x01,0x49,0x01,0xf0,0xd3,0xb8,0x00,0xbf,0x44,0x01,0x00,0x20,0x01,0x49,0x01,0xf0,0xcd,0xb8,0x00,0xbf,0xb8
,0x02,0x00,0x20,0x05,0x4b,0x1b,0x68,0x9b,0x78,0x07,0x2b,0x04,0xd8,0x04,0x49,0x01,0xeb,0xc3,0x01,0x01,0xf0,0xc0,0xb8,0x00,0x20,0x70,0x47,0x04,0x03,0x00,0x20,0x94
,0x00,0x00,0x20,0x01,0x49,0x01,0xf0,0xb7,0xb8,0x00,0xbf,0xe0,0x00,0x00,0x20,0x08,0xb5,0x07,0x4b,0x1b,0x68,0x1b,0x78,0x03,0xf0,0x7f,0x03,0x21,0x2b,0x02,0xd1,0x00
,0xf0,0x5c,0xfc,0x08,0xb9,0x02,0x20,0x08,0xbd,0x00,0x20,0x08,0xbd,0x00,0xbf,0x04,0x03,0x00,0x20,0x70,0x47,0x70,0x47,0x70,0x47,0x70,0x47,0x70,0x47,0x70,0x47,0x70
,0x47,0x70,0x47,0x70,0x47,0x00,0x00,0x38,0xb5,0x13,0x4d,0x09,0x20,0x2c,0x68,0x00,0xf0,0x5e,0xfb,0x20,0x40,0x11,0x4c,0x40,0xf0,0x50,0x00,0x28,0x60,0x01,0x22,0x20
,0x46,0x09,0x21,0x00,0xf0,0x9c,0xf9,0x00,0x22,0x20,0x46,0x09,0x21,0x00,0xf0,0x97,0xf9,0x00,0xf0,0x5f,0xfb,0x0a,0x4b,0xc2,0xb2,0x18,0x60,0x09,0x4b,0xc0,0xf3,0x07
,0x20,0x83,0xf8,0x29,0x20,0x83,0xf8,0x2a,0x00,0x07,0x4b,0x5a,0x71,0x98,0x71,0xbd,0xe8,0x38,0x40,0x00,0xf0,0x9a,0xbe,0x04,0x0c,0x01,0x40,0x00,0x0c,0x01,0x40,0xc8
,0x02,0x00,0x20,0xec,0x00,0x00,0x20,0x29,0x01,0x00,0x20,0x04,0x4a,0x13,0x68,0x9b,0xb2,0x43,0xf0,0x0c,0x03,0x13,0x60,0x02,0x4b,0x03,0x22,0x1a,0x60,0x70,0x47,0x40
,0x5c,0x00,0x40,0x10,0x03,0x00,0x20,0x4f,0xf6,0xfb,0x72,0x03,0x4b,0x19,0x68,0x0a,0x40,0x1a,0x60,0x4f,0xf4,0x3f,0x42,0x1a,0x60,0x70,0x47,0x40,0x5c,0x00,0x40,0x10
,0xb5,0x1e,0x4c,0x07,0x28,0x18,0xbf,0x20,0x70,0x23,0x78,0x05,0x2b,0x32,0xd8,0xdf,0xe8,0x03,0xf0,0x03,0x06,0x0a,0x0e,0x16,0x21,0xff,0xf7,0xe5,0xff,0x2a,0xe0,0xff
,0xf7,0xe2,0xff,0x04,0x23,0x27,0xe0,0x02,0x23,0x63,0x70,0x03,0x23,0x23,0xe0,0x63,0x78,0x01,0x3b,0xdb,0xb2,0x63,0x70,0x63,0x78,0xf3,0xb9,0x04,0x22,0x17,0xe0,0x0f
,0x4a,0x13,0x68,0x9b,0xb2,0x43,0xf0,0x10,0x03,0x13,0x60,0x05,0x23,0x23,0x70,0x0a,0x23,0x63,0x70,0x10,0xbd,0x63,0x78,0x01,0x3b,0xdb,0xb2,0x63,0x70,0x63,0x78,0x5b
,0xb9,0x4f,0xf6,0xef,0x73,0x06,0x4a,0x11,0x68,0x0b,0x40,0x13,0x60,0x06,0x22,0x02,0x4b,0x1a,0x70,0x10,0xbd,0x06,0x23,0x23,0x70,0x10,0xbd,0xce,0x02,0x00,0x20,0x40
,0x5c,0x00,0x40,0x06,0x4b,0x01,0x22,0x1a,0x60,0x06,0x4a,0x00,0x20,0x06,0x49,0x18,0x60,0x10,0x60,0x4f,0xf4,0xe0,0x52,0x0a,0x80,0x1a,0x60,0x70,0x47,0x00,0xbf,0x40
,0x5c,0x00,0x40,0x44,0x5c,0x00,0x40,0x08,0x03,0x00,0x20,0x07,0xb5,0x14,0x23,0x8d,0xf8,0x04,0x30,0x00,0x23,0x8d,0xf8,0x05,0x30,0x8d,0xf8,0x06,0x30,0x01,0xa8,0x01
,0x23,0x8d,0xf8,0x07,0x30,0x00,0xf0,0xfb,0xf9,0x03,0xb0,0x5d,0xf8,0x04,0xfb,0x10,0xb5,0x00,0xf0,0xcb,0xfa,0x09,0x4b,0x00,0x24,0x1b,0x68,0x9c,0x72,0xff,0xf7,0xd1
,0xff,0x07,0x4b,0x07,0x4a,0x1c,0x60,0x4f,0xf4,0x3f,0x43,0x13,0x80,0x06,0x4a,0x13,0x60,0xff,0xf7,0xdb,0xff,0x05,0x4b,0x1c,0x60,0x10,0xbd,0x04,0x03,0x00,0x20,0x44
,0x5c,0x00,0x40,0x08,0x03,0x00,0x20,0x40,0x5c,0x00,0x40,0x10,0x03,0x00,0x20,0x07,0xb5,0x14,0x23,0x8d,0xf8,0x04,0x30,0x01,0xa8,0x00,0x23,0x8d,0xf8,0x05,0x30,0x8d
,0xf8,0x06,0x30,0x8d,0xf8,0x07,0x30,0x00,0xf0,0xca,0xf9,0x03,0xb0,0x5d,0xf8,0x04,0xfb,0x00,0x00,0x70,0xb5,0x27,0x4d,0x27,0x4c,0x2b,0x68,0x27,0x4e,0x9b,0xb2,0x23
,0x80,0x22,0x88,0x33,0x88,0x13,0x40,0x5b,0x05,0x05,0xd5,0x4f,0xf6,0xff,0x33,0x2b,0x60,0x23,0x4b,0x5b,0x68,0x98,0x47,0x22,0x88,0x31,0x88,0x0a,0x40,0x90,0x04,0x44
,0xbf,0x4d,0xf6,0xff,0x73,0x2b,0x60,0x23,0x88,0x0b,0x40,0xda,0x04,0x05,0xd5,0x4e,0xf6,0xff,0x73,0x00,0x20,0x2b,0x60,0xff,0xf7,0x42,0xff,0x22,0x88,0x33,0x88,0x13
,0x40,0x1b,0x05,0x04,0xd5,0xff,0xf7,0x21,0xff,0x4f,0xf2,0xff,0x73,0x2b,0x60,0x22,0x88,0x31,0x88,0x0a,0x40,0x90,0x05,0x07,0xd5,0x4f,0xf6,0xff,0x53,0x11,0x4a,0x2b
,0x60,0x13,0x78,0x01,0x33,0xdb,0xb2,0x13,0x70,0x23,0x88,0x0b,0x40,0xda,0x05,0x05,0xd5,0x4f,0xf6,0xff,0x63,0x07,0x20,0x2b,0x60,0xff,0xf7,0x21,0xff,0x22,0x88,0x33
,0x88,0x13,0x40,0x1b,0x04,0x03,0xd5,0xbd,0xe8,0x70,0x40,0x00,0xf0,0xdc,0xbc,0x70,0xbd,0x00,0xbf,0x44,0x5c,0x00,0x40,0xcc,0x02,0x00,0x20,0x08,0x03,0x00,0x20,0x00
,0x00,0x00,0x20,0x0c,0x03,0x00,0x20,0x73,0xb5,0x00,0xf0,0xa3,0xf8,0x00,0xf0,0xc5,0xf8,0x00,0xf0,0xf3,0xf8,0xff,0xf7,0xb7,0xfe,0x00,0xf0,0x03,0xf9,0x00,0xf0,0x3b
,0xf9,0x01,0x28,0x04,0x46,0x02,0xd0,0x02,0x28,0x33,0xd0,0x08,0xe0,0x00,0x90,0x01,0x46,0x4f,0xf4,0xa0,0x23,0x05,0x22,0x26,0x48,0x00,0xf0,0x63,0xf8,0x42,0xe0,0x01
,0x24,0x24,0x48,0x00,0x94,0x4f,0xf4,0xa0,0x23,0x05,0x22,0x21,0x46,0x00,0xf0,0x59,0xf8,0x21,0x48,0x00,0xf0,0xf4,0xf8,0x28,0xb1,0x00,0xf0,0x4b,0xf8,0x04,0x1c,0x18
,0xbf,0x01,0x24,0x2f,0xe0,0x1d,0x48,0x00,0xf0,0xea,0xf8,0x58,0xb3,0xf4,0xe7,0x01,0x22,0x4f,0xf4,0x80,0x13,0x11,0x46,0x16,0x48,0x00,0x96,0x00,0xf0,0x42,0xf8,0x00
,0xf0,0xe8,0xfb,0x08,0xb1,0x00,0xf0,0xeb,0xfb,0x01,0x35,0x05,0x2d,0xef,0xd9,0x00,0x2c,0xed,0xd1,0x11,0x48,0x00,0xf0,0xd3,0xf8,0x08,0xb1,0x0f,0x48,0x04,0xe0,0x0d
,0x48,0x00,0xf0,0xcd,0xf8,0x18,0xb1,0x0b,0x48,0x00,0xf0,0x5f,0xf9,0x0d,0xe0,0x01,0x21,0x00,0x91,0x4f,0xf4,0xa0,0x23,0x05,0x22,0x06,0x48,0x00,0xf0,0x22,0xf8,0x00
,0xf0,0x66,0xf9,0x02,0xe0,0x00,0x25,0x01,0x26,0xdf,0xe7,0x00,0x20,0x02,0xb0,0x70,0xbd,0x00,0xbf,0x00,0x0c,0x01,0x40,0x00,0x50,0x00,0x08,0x00,0x20,0x00,0x08,0xb2
,0xfa,0x82,0xf2,0x01,0x23,0x52,0x09,0x03,0xfa,0x01,0xf1,0x12,0x01,0x91,0x40,0x01,0x61,0x70,0x47,0x02,0x4b,0x18,0x68,0xc0,0xf3,0x00,0x20,0x70,0x47,0x00,0xbf,0x08
,0x0c,0x01,0x40,0x2d,0xe9,0xf8,0x43,0x9d,0xf8,0x20,0x90,0x14,0x46,0xc9,0xf1,0x01,0x05,0xed,0xb2,0x2a,0x46,0x07,0x46,0x88,0x46,0x1e,0x46,0xff,0xf7,0xe0,0xff,0xb4
,0xb1,0x33,0x46,0x13,0xb1,0x00,0xbf,0x01,0x3b,0xfb,0xe7,0x4a,0x46,0x41,0x46,0x38,0x46,0xff,0xf7,0xd5,0xff,0x33,0x46,0x13,0xb1,0x00,0xbf,0x01,0x3b,0xfb,0xe7,0x2a
,0x46,0x41,0x46,0x38,0x46,0x01,0x3c,0xff,0xf7,0xca,0xff,0xe4,0xb2,0xe7,0xe7,0xbd,0xe8,0xf8,0x83,0x0d,0x4b,0x0e,0x49,0x1a,0x68,0x42,0xf0,0x01,0x02,0x1a,0x60,0x08
,0x68,0x0c,0x4a,0x02,0x40,0x0a,0x60,0x1a,0x68,0x22,0xf0,0x84,0x72,0x22,0xf4,0x80,0x32,0x1a,0x60,0x1a,0x68,0x22,0xf4,0x80,0x22,0x1a,0x60,0x0b,0x68,0x00,0x22,0x23
,0xf4,0xfe,0x03,0x0b,0x60,0x04,0x4b,0x1a,0x60,0x70,0x47,0x00,0x10,0x02,0x40,0x04,0x10,0x02,0x40,0x00,0x00,0xff,0xf8,0x08,0x10,0x02,0x40,0x15,0x4b,0x1a,0x68,0x42
,0xf0,0x01,0x12,0x1a,0x60,0x1a,0x68,0x12,0x48,0x92,0x03,0xfb,0xd5,0x12,0x4a,0x12,0x21,0x11,0x60,0xa2,0xf6,0xfc,0x72,0x11,0x68,0x41,0xf4,0xe8,0x11,0x41,0xf4,0x80
,0x61,0x11,0x60,0x01,0x68,0x41,0xf0,0x80,0x71,0x01,0x60,0x19,0x68,0x11,0xf0,0x40,0x7f,0xfb,0xd0,0x11,0x68,0x41,0xf0,0x02,0x01,0x11,0x60,0x11,0x68,0x09,0x07,0xfc
,0xd5,0x9a,0x69,0x42,0xf4,0xfe,0x72,0x9a,0x61,0xda,0x69,0x42,0xf4,0x00,0x02,0xda,0x61,0x70,0x47,0x00,0x10,0x02,0x40,0x00,0x20,0x02,0x40,0x06,0x4b,0x07,0x4a,0x1a
,0x60,0x4f,0xf0,0x80,0x72,0xda,0x60,0x05,0x4a,0x13,0x68,0x23,0xf0,0xf0,0x03,0x43,0xf0,0x10,0x03,0x13,0x60,0x70,0x47,0x04,0x0c,0x01,0x40,0x08,0x0c,0x01,0x40,0x00
,0x0c,0x01,0x40,0x05,0x4b,0x1a,0x68,0xd1,0x07,0x5e,0xbf,0x1a,0x68,0x42,0xf0,0x01,0x02,0x1a,0x60,0x1a,0x68,0x92,0x07,0xfc,0xd5,0x70,0x47,0x00,0x10,0x02,0x40,0x03
,0x68,0x03,0x48,0x18,0x40,0x00,0xf1,0x60,0x43,0x58,0x42,0x58,0x41,0x70,0x47,0x00,0x00,0xfe,0x2f,0x03,0x4a,0x43,0x68,0x10,0x60,0x02,0x68,0x82,0xf3,0x08,0x88,0x18
,0x47,0x00,0xbf,0x08,0xed,0x00,0xe0,0x08,0x4a,0xd3,0x69,0x43,0xf0,0xc0,0x53,0xd3,0x61,0x07,0x4b,0x1a,0x68,0x42,0xf4,0x80,0x72,0x1a,0x60,0x05,0x4a,0x10,0x85,0x1a
,0x68,0x22,0xf4,0x80,0x72,0x1a,0x60,0x70,0x47,0x00,0xbf,0x00,0x10,0x02,0x40,0x00,0x70,0x00,0x40,0x00,0x6c,0x00,0x40,0x44,0xf2,0x4c,0x21,0x0e,0x4b,0x10,0xb5,0xda
,0x69,0x42,0xf0,0xc0,0x52,0xda,0x61,0x0c,0x4a,0x12,0x8d,0x92,0xb2,0x8a,0x42,0x19,0x46,0x07,0xd0,0x44,0xf2,0x4d,0x23,0x9a,0x42,0x01,0xd1,0x02,0x24,0x02,0xe0,0x00
,0x24,0x07,0xe0,0x01,0x24,0x00,0x20,0xff,0xf7,0xce,0xff,0xcb,0x69,0x23,0xf0,0xc0,0x53,0xcb,0x61,0x20,0x46,0x10,0xbd,0x00,0x10,0x02,0x40,0x00,0x6c,0x00,0x40,0x17
,0x4b,0x30,0xb5,0xda,0x68,0x43,0x78,0xd2,0x43,0xc2,0xf3,0x02,0x22,0xc2,0xf1,0x04,0x01,0x03,0xfa,0x01,0xf1,0x0f,0x23,0xd3,0x40,0x82,0x78,0x13,0x40,0x02,0x78,0x0b
,0x43,0x02,0xf0,0x03,0x01,0x02,0xf0,0xfc,0x02,0x02,0xf1,0x60,0x42,0x02,0xf5,0x61,0x42,0xd2,0xf8,0x00,0x43,0xcd,0x00,0x1b,0x01,0xab,0x40,0xff,0x21,0xa9,0x40,0x63
,0x40,0x0b,0x40,0x63,0x40,0xc2,0xf8,0x00,0x33,0x03,0x78,0x01,0x22,0x59,0x09,0x03,0xf0,0x1f,0x03,0x02,0xfa,0x03,0xf3,0x02,0x4a,0x42,0xf8,0x21,0x30,0x30,0xbd,0x00
,0xed,0x00,0xe0,0x00,0xe1,0x00,0xe0,0x07,0x4b,0x4f,0xf0,0xff,0x32,0xc3,0xf8,0x80,0x20,0xc3,0xf8,0x84,0x20,0xc3,0xf8,0x80,0x21,0xc3,0xf8,0x84,0x21,0x04,0x22,0x43
,0xf8,0xf0,0x2c,0x70,0x47,0x00,0xbf,0x00,0xe1,0x00,0xe0,0x10,0xb5,0x04,0x46,0x06,0x4b,0x80,0x22,0x1a,0x60,0xff,0xf7,0xdb,0xfd,0xff,0xf7,0xe5,0xff,0xff,0xf7,0xe9
,0xfe,0x20,0x46,0xbd,0xe8,0x10,0x40,0xff,0xf7,0x64,0xbf,0x10,0x20,0x02,0x40,0x02,0x4a,0x03,0x4b,0xda,0x60,0x00,0xbf,0xfd,0xe7,0x00,0xbf,0x04,0x00,0xfa,0x05,0x00
,0xed,0x00,0xe0,0x0a,0x4b,0x10,0xb5,0x1a,0x68,0x0a,0x4c,0x02,0x22,0x1a,0x60,0x22,0x68,0x08,0x49,0x12,0xf0,0x01,0x0f,0xfa,0xd1,0x07,0x4a,0x10,0x60,0x42,0x22,0x1a
,0x60,0x0a,0x68,0x12,0xf0,0x01,0x02,0xfb,0xd1,0x1a,0x60,0x01,0x20,0x10,0xbd,0x10,0x20,0x02,0x40,0x0c,0x20,0x02,0x40,0x14,0x20,0x02,0x40,0x73,0xb5,0x8b,0xb2,0x00
,0x93,0x0b,0x0c,0x01,0x93,0x0f,0x4b,0x01,0x24,0x0f,0x4e,0x1a,0x68,0x1c,0x60,0x34,0x68,0x0d,0x4d,0x14,0xf0,0x01,0x0f,0xfa,0xd1,0x01,0x9c,0xa4,0xb2,0x44,0x80,0x2c
,0x68,0xe6,0x07,0xfc,0xd4,0x00,0x9c,0xa4,0xb2,0x04,0x80,0x2c,0x68,0xe4,0x07,0xfc,0xd4,0x22,0xf0,0x01,0x02,0x1a,0x60,0x00,0x68,0x0b,0x1a,0x58,0x42,0x58,0x41,0x02
,0xb0,0x70,0xbd,0x10,0x20,0x02,0x40,0x0c,0x20,0x02,0x40,0x01,0x4b,0x80,0x22,0x1a,0x60,0x70,0x47,0x10,0x20,0x02,0x40,0x03,0x4b,0x04,0x4a,0x1a,0x60,0x02,0xf1,0x88
,0x32,0x1a,0x60,0x70,0x47,0x00,0xbf,0x04,0x20,0x02,0x40,0x23,0x01,0x67,0x45,0x07,0x28,0xc8,0xbf,0x08,0x38,0x0f,0x23,0x80,0x00,0x03,0xfa,0x00,0xf0,0xc0,0x43,0x70
,0x47,0x00,0x00,0x02,0x4b,0x18,0x88,0x00,0xf5,0x00,0x30,0x80,0x02,0x70,0x47,0xe0,0xf7,0xff,0x1f,0x04,0x4b,0x1b,0x88,0x80,0x2b,0x8c,0xbf,0x4f,0xf4,0x00,0x60,0x4f
,0xf4,0x80,0x60,0x70,0x47,0x00,0xbf,0xe0,0xf7,0xff,0x1f,0x0d,0x4a,0x00,0x23,0x02,0x21,0x13,0x70,0x53,0x70,0x93,0x70,0xd3,0x70,0x11,0x71,0x53,0x71,0x0a,0x4a,0x0a
,0x49,0x13,0x60,0x0a,0x4a,0x13,0x80,0x0a,0x4a,0x11,0x60,0x0a,0x4a,0x01,0xf5,0x88,0x41,0x11,0x60,0x09,0x4a,0x03,0x21,0x13,0x70,0x09,0x4a,0x11,0x70,0x09,0x4a,0x13
,0x70,0x70,0x47,0x1d,0x0b,0x00,0x20,0x18,0x0b,0x00,0x20,0x00,0x0c,0x00,0x20,0x16,0x0b,0x00,0x20,0xc4,0x02,0x00,0x20,0xc0,0x02,0x00,0x20,0x1c,0x0b,0x00,0x20,0xd0
,0x02,0x00,0x20,0x23,0x0b,0x00,0x20,0x08,0xb5,0x0e,0x4b,0x0e,0x48,0x1a,0x79,0x00,0x21,0xd2,0xb2,0x01,0x2a,0x01,0x60,0x08,0xd1,0x02,0x22,0x1a,0x71,0x19,0x70,0xff
,0xf7,0x22,0xff,0xbd,0xe8,0x08,0x40,0xff,0xf7,0xe0,0xbc,0x12,0xf0,0xfd,0x0f,0x06,0xd0,0x02,0x22,0x1a,0x71,0x19,0x70,0xbd,0xe8,0x08,0x40,0xff,0xf7,0x38,0xbf,0x08
,0xbd,0x00,0xbf,0x1d,0x0b,0x00,0x20,0x18,0x0b,0x00,0x20,0x20,0xb9,0x03,0x4b,0x01,0x22,0x1b,0x68,0x1a,0x82,0x70,0x47,0x01,0x48,0x70,0x47,0x04,0x03,0x00,0x20,0x21
,0x0b,0x00,0x20,0x20,0xb9,0x03,0x4b,0x06,0x22,0x1b,0x68,0x1a,0x82,0x70,0x47,0x01,0x48,0x70,0x47,0x04,0x03,0x00,0x20,0x1d,0x0b,0x00,0x20,0x06,0x4b,0x1b,0x68,0x30
,0xb9,0xd9,0x88,0x5a,0x8a,0x8a,0x1a,0x1a,0x82,0x04,0x4b,0x19,0x80,0x70,0x47,0x5b,0x8a,0x03,0x48,0x18,0x44,0x70,0x47,0x04,0x03,0x00,0x20,0x16,0x0b,0x00,0x20,0x14
,0x03,0x00,0x20,0x08,0x4a,0x30,0xb9,0x12,0x68,0x08,0x4b,0x51,0x8a,0x1b,0x88,0x5b,0x1a,0x13,0x82,0x70,0x47,0x06,0x4b,0x12,0x68,0x18,0x68,0x05,0x4b,0x52,0x8a,0x1b
,0x68,0x18,0x44,0x10,0x44,0x70,0x47,0x04,0x03,0x00,0x20,0x16,0x0b,0x00,0x20,0x18,0x0b,0x00,0x20,0xc4,0x02,0x00,0x20,0x2d,0xe9,0xf0,0x41,0x13,0x4b,0x14,0x4e,0x1b
,0x78,0x34,0x68,0x02,0x2b,0x04,0xf1,0x00,0x64,0x0c,0xbf,0x04,0xf5,0xa0,0x44,0x04,0xf5,0x00,0x54,0x20,0x46,0xff,0xf7,0xe5,0xfe,0x0e,0x4f,0xdf,0xf8,0x38,0x80,0x00
,0x25,0x3b,0x88,0x0b,0x49,0x9b,0xb2,0x9d,0x42,0x06,0xda,0x55,0xf8,0x08,0x10,0x60,0x19,0xff,0xf7,0xf3,0xfe,0x04,0x35,0xf3,0xe7,0x0b,0x88,0x9a,0xb2,0x33,0x68,0x13
,0x44,0x33,0x60,0x00,0x23,0x0b,0x80,0xbd,0xe8,0xf0,0x81,0x1c,0x0b,0x00,0x20,0x18,0x0b,0x00,0x20,0x16,0x0b,0x00,0x20,0x14,0x03,0x00,0x20,0xf8,0xb5,0x81,0x49,0x81
,0x4c,0x01,0x20,0x08,0x70,0x23,0x79,0x00,0x22,0xdb,0xb2,0x02,0x2b,0x22,0x70,0x5a,0xd1,0x08,0x70,0x7d,0x49,0x09,0x68,0x48,0x78,0x01,0x28,0x2a,0xd1,0xc8,0x88,0x00
,0x28,0x00,0xf0,0xc6,0x80,0x7a,0x48,0x09,0x7b,0x02,0x60,0x01,0x29,0x4f,0xf0,0x03,0x02,0x22,0x71,0x0b,0xd0,0x02,0x29,0x1a,0xd1,0x76,0x4b,0x1a,0x70,0x76,0x4a,0x76
,0x4b,0x1a,0x60,0xff,0xf7,0xde,0xfd,0xff,0xf7,0xe6,0xfe,0x0b,0xe0,0x74,0x49,0x72,0x4a,0x11,0x60,0x6f,0x4a,0x13,0x70,0xff,0xf7,0xd4,0xfd,0xff,0xf7,0xdc,0xfe,0x6d
,0x48,0xff,0xf7,0x8f,0xfe,0x44,0xf2,0x4d,0x20,0xff,0xf7,0xed,0xfd,0xc3,0xe0,0x0a,0x23,0x62,0xe0,0x02,0x28,0x21,0xd1,0x09,0x23,0x23,0x71,0xca,0x88,0x69,0x4b,0x69
,0x48,0x1a,0x80,0x1a,0x88,0x92,0xb2,0x02,0x80,0x1b,0x88,0x4a,0x88,0x9b,0xb2,0x53,0x43,0x5f,0x4a,0x13,0x60,0x0b,0x7b,0x01,0x2b,0x03,0xd0,0x02,0x2b,0x09,0xd1,0x5d
,0x4a,0x00,0xe0,0x5e,0x4a,0x5d,0x4b,0x1a,0x60,0xff,0xf7,0xcb,0xfe,0x5f,0x4b,0x18,0x60,0xa1,0xe0,0x0a,0x23,0x23,0x71,0x03,0x23,0x9c,0xe0,0x06,0x28,0x3c,0xd0,0x03
,0x28,0x19,0xd0,0x05,0x28,0x3c,0xe0,0x03,0x2b,0x0b,0xd1,0x4f,0x4a,0x12,0x68,0x52,0x78,0x03,0x2a,0x04,0xd1,0x05,0x23,0x23,0x71,0xff,0xf7,0x5d,0xff,0x8b,0xe0,0x05
,0x2a,0x2e,0xe0,0x04,0x2b,0x09,0xd1,0x51,0x49,0x08,0x78,0x02,0x28,0x01,0xbf,0x03,0x23,0x62,0x70,0x0b,0x70,0x05,0x23,0x23,0x71,0x7d,0xe0,0x05,0x2b,0x14,0xd1,0x42
,0x4b,0x1a,0x68,0x53,0x78,0x01,0x2b,0x08,0xd1,0xd3,0x88,0x0b,0xb1,0x03,0x23,0xf2,0xe7,0x06,0x23,0x23,0x71,0xff,0xf7,0x79,0xfe,0x6d,0xe0,0x06,0x2b,0x4e,0xd0,0x03
,0x2b,0x4c,0xd0,0x05,0x2b,0x63,0xd1,0x49,0xe0,0x06,0x2b,0x0b,0xd1,0x37,0x49,0x09,0x68,0x49,0x78,0x03,0x29,0x03,0xd1,0x08,0x23,0x23,0x71,0x22,0x70,0x5b,0xe0,0x05
,0x29,0x55,0xd1,0xd8,0xe7,0x07,0x2b,0xf6,0xd0,0x08,0x2b,0xd4,0xd0,0x09,0x2b,0x3d,0xd1,0x2e,0x4b,0x1a,0x68,0x53,0x78,0x02,0x2b,0x2e,0xd1,0xd0,0x88,0x40,0xb3,0x30
,0x4e,0x52,0x88,0x33,0x88,0x2a,0x4d,0x9b,0xb2,0x53,0x43,0x2b,0x4f,0x2b,0x60,0xd7,0xf8,0x00,0xc0,0xdf,0xf8,0xb4,0xe0,0x2b,0x68,0x32,0x88,0x63,0x44,0xde,0xf8,0x00
,0x10,0x92,0xb2,0x13,0x44,0x8b,0x42,0x27,0x49,0x03,0xd8,0x33,0x88,0x9b,0xb2,0x0b,0x80,0x1a,0xe0,0xde,0xf8,0x00,0x20,0x3b,0x68,0x2d,0x68,0xd3,0x1a,0x5b,0x1b,0x9b
,0xb2,0x0b,0x80,0x0b,0x88,0x9b,0xb2,0x98,0x42,0x08,0xd8,0x00,0x23,0x0b,0x80,0x05,0xe0,0x0a,0x23,0x23,0x71,0x09,0x23,0x1d,0xe0,0x06,0x2b,0x01,0xd1,0x02,0x23,0x9a
,0xe7,0x03,0x2b,0x01,0xd0,0x05,0x2b,0x12,0xd1,0x09,0x23,0x94,0xe7,0x0a,0x2b,0x0e,0xd1,0x0e,0x4b,0x1b,0x68,0x5b,0x78,0x03,0x2b,0x01,0xd1,0x0a,0x23,0x8b,0xe7,0x05
,0x2b,0xfb,0xd0,0x04,0x2b,0x03,0xd1,0x02,0x23,0x23,0x71,0x00,0x23,0x02,0xe0,0x0a,0x23,0x23,0x71,0x0f,0x23,0x23,0x70,0x20,0x78,0xb0,0xfa,0x80,0xf0,0x40,0x09,0xf8
,0xbd,0x00,0xbf,0x23,0x0b,0x00,0x20,0x1d,0x0b,0x00,0x20,0x04,0x03,0x00,0x20,0x18,0x0b,0x00,0x20,0x1c,0x0b,0x00,0x20,0x00,0x20,0x00,0x08,0xc4,0x02,0x00,0x20,0x00
,0x50,0x00,0x08,0x14,0x0b,0x00,0x20,0x16,0x0b,0x00,0x20,0xc0,0x02,0x00,0x20,0xd0,0x02,0x00,0x20,0x01,0x4b,0x18,0x78,0x70,0x47,0x00,0xbf,0x23,0x0b,0x00,0x20,0x00
,0xbf,0xfd,0xe7,0x80,0x00,0x00,0xf1,0x80,0x40,0x00,0xf5,0xb8,0x40,0x03,0x68,0xca,0x06,0x23,0xf4,0xe0,0x43,0x23,0xf0,0x40,0x03,0x9b,0xb2,0x48,0xbf,0x83,0xf0,0x10
,0x03,0x8a,0x06,0x48,0xbf,0x83,0xf0,0x20,0x03,0x03,0x60,0x70,0x47,0x80,0x00,0x00,0xf1,0x80,0x40,0x00,0xf5,0xb8,0x40,0x03,0x68,0x23,0xf4,0x80,0x43,0x23,0xf0,0x70
,0x03,0x9b,0xb2,0x83,0xf4,0x40,0x53,0x03,0x60,0x70,0x47,0x80,0x00,0x00,0xf1,0x80,0x40,0x00,0xf5,0xb8,0x40,0x03,0x68,0x23,0xf4,0xe2,0x43,0x23,0xf0,0x70,0x03,0x1b
,0x04,0x1b,0x0c,0x03,0x60,0x70,0x47,0xff,0xf7,0xf0,0xbf,0x80,0x00,0x00,0xf1,0x80,0x40,0x00,0xf5,0xb8,0x40,0x03,0x68,0x5b,0x04,0x06,0xd5,0x48,0xf6,0x8f,0x73,0x02
,0x68,0x13,0x40,0x43,0xf4,0x80,0x43,0x03,0x60,0x70,0x47,0x80,0x00,0x00,0xf1,0x80,0x40,0x00,0xf5,0xb8,0x40,0x03,0x68,0x5b,0x06,0x06,0xd5,0x48,0xf6,0x8f,0x73,0x02
,0x68,0x13,0x40,0x43,0xf0,0x40,0x03,0x03,0x60,0x70,0x47,0x04,0x4b,0x1b,0x68,0x9b,0xb2,0x03,0xeb,0xc0,0x00,0x03,0x4b,0x03,0x44,0x5b,0x00,0x19,0x60,0x70,0x47,0x50
,0x5c,0x00,0x40,0x02,0x30,0x00,0x20,0x0d,0x4b,0x3e,0x29,0x1b,0x68,0x9b,0xb2,0x03,0xeb,0xc0,0x00,0x0b,0x4b,0x03,0x44,0x4f,0xea,0x43,0x02,0x09,0xd9,0x4b,0x09,0xc8
,0x06,0x04,0xbf,0x03,0xf1,0xff,0x33,0x9b,0xb2,0x9b,0x02,0x43,0xf4,0x00,0x43,0x04,0xe0,0x4b,0x08,0xc9,0x07,0x48,0xbf,0x01,0x33,0x9b,0x02,0x13,0x60,0x70,0x47,0x50
,0x5c,0x00,0x40,0x06,0x30,0x00,0x20,0x05,0x4b,0x1b,0x68,0x9b,0xb2,0x03,0xeb,0xc0,0x00,0x00,0xf1,0x00,0x50,0x00,0xf5,0x40,0x50,0x40,0x00,0x00,0x88,0x70,0x47,0x50
,0x5c,0x00,0x40,0xff,0xf7,0xf0,0xbf,0x04,0x4b,0x1b,0x68,0x9b,0xb2,0x03,0xeb,0xc0,0x00,0x03,0x4b,0x03,0x44,0x5b,0x00,0x18,0x88,0x70,0x47,0x50,0x5c,0x00,0x40,0x04
,0x30,0x00,0x20,0xff,0xf7,0xf0,0xbf,0x2d,0xe9,0xf8,0x43,0xdf,0xf8,0x58,0x81,0x4e,0x4f,0xc1,0x46,0x3b,0x68,0x4e,0x4a,0x99,0xb2,0x1b,0x04,0x11,0x80,0x40,0xf1,0x92
,0x80,0x47,0xf6,0xff,0x73,0x3b,0x60,0x13,0x88,0x03,0xf0,0x0f,0x03,0x88,0xf8,0x00,0x30,0x00,0x2b,0x60,0xd1,0x47,0x4c,0x47,0x4e,0x23,0x68,0x47,0x4d,0x03,0xf4,0x40
,0x53,0x33,0x80,0x23,0x68,0x03,0xf0,0x30,0x03,0x2b,0x80,0x23,0x68,0x23,0xf4,0x80,0x43,0x23,0xf0,0x70,0x03,0x9b,0xb2,0x83,0xf4,0x00,0x53,0x23,0x60,0x23,0x68,0x23
,0xf4,0xe0,0x43,0x23,0xf0,0x40,0x03,0x9b,0xb2,0x83,0xf0,0x20,0x03,0x23,0x60,0x13,0x88,0xd8,0x06,0x02,0xd5,0x23,0x68,0x19,0x06,0x07,0xd5,0x48,0xf6,0x0f,0x73,0x22
,0x68,0x13,0x40,0x23,0x60,0x00,0xf0,0x6f,0xfc,0x12,0xe0,0x1a,0x05,0x07,0xd5,0x40,0xf6,0x8f,0x73,0x22,0x68,0x13,0x40,0x23,0x60,0x00,0xf0,0x6b,0xfa,0x08,0xe0,0x1b
,0x04,0xb7,0xd5,0x40,0xf6,0x8f,0x73,0x22,0x68,0x13,0x40,0x23,0x60,0x00,0xf0,0xdd,0xfb,0x23,0x68,0x32,0x88,0x23,0xf4,0x80,0x43,0x23,0xf0,0x70,0x03,0x9b,0xb2,0xd7
,0x04,0x48,0xbf,0x83,0xf4,0x80,0x53,0x96,0x04,0x22,0x4a,0x48,0xbf,0x83,0xf4,0x00,0x53,0x13,0x60,0x13,0x68,0x29,0x88,0x23,0xf4,0xe0,0x43,0x23,0xf0,0x40,0x03,0x9b
,0xb2,0xcc,0x06,0x48,0xbf,0x83,0xf0,0x10,0x03,0x88,0x06,0x48,0xbf,0x83,0xf0,0x20,0x03,0x13,0x60,0xbd,0xe8,0xf8,0x83,0x9a,0x00,0x02,0xf1,0x80,0x42,0x02,0xf5,0xb8
,0x42,0x14,0x68,0x21,0x04,0x09,0xd5,0x40,0xf6,0x8f,0x71,0x10,0x68,0x01,0x3b,0x01,0x40,0x11,0x60,0x12,0x4a,0x52,0xf8,0x23,0x30,0x98,0x47,0x22,0x06,0x7f,0xf5,0x79
,0xaf,0x48,0xf6,0x0f,0x71,0x99,0xf8,0x00,0x20,0x93,0x00,0x03,0xf1,0x80,0x43,0x03,0xf5,0xb8,0x43,0x18,0x68,0x01,0x3a,0x01,0x40,0x19,0x60,0x09,0x4b,0x53,0xf8,0x22
,0x30,0x98,0x47,0x66,0xe7,0xbd,0xe8,0xf8,0x83,0x00,0xbf,0x44,0x5c,0x00,0x40,0xcc,0x02,0x00,0x20,0x00,0x5c,0x00,0x40,0xd2,0x02,0x00,0x20,0xd4,0x02,0x00,0x20,0x50
,0x00,0x00,0x20,0x34,0x00,0x00,0x20,0xe0,0x02,0x00,0x20,0x06,0x4b,0x07,0x4a,0x07,0x49,0x13,0x60,0x02,0x22,0x1a,0x72,0x06,0x4b,0x07,0x4a,0x13,0x60,0x07,0x4a,0x1b
,0x68,0x11,0x60,0x18,0x47,0x00,0xbf,0xe4,0x02,0x00,0x20,0x04,0x03,0x00,0x20,0x6c,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0xdc,0x02,0x00,0x20,0x00,0x03,0x00,0x20,0x10
,0xb5,0x06,0x4c,0x18,0xb9,0x23,0x68,0x01,0x22,0x1a,0x82,0x10,0xbd,0x04,0x4b,0x1b,0x68,0x1b,0x68,0x98,0x47,0x20,0x68,0x0a,0x30,0x10,0xbd,0x04,0x03,0x00,0x20,0x00
,0x03,0x00,0x20,0x10,0xb5,0x06,0x4c,0x18,0xb9,0x23,0x68,0x01,0x22,0x1a,0x82,0x10,0xbd,0x04,0x4b,0x1b,0x68,0x9b,0x68,0x98,0x47,0x20,0x68,0x0c,0x30,0x10,0xbd,0x04
,0x03,0x00,0x20,0x00,0x03,0x00,0x20,0x10,0xb5,0x20,0x4a,0x18,0xb9,0x13,0x68,0x02,0x22,0x1a,0x82,0x10,0xbd,0x1e,0x48,0x14,0x68,0x00,0x23,0x03,0x80,0x21,0x78,0x02
,0x46,0x11,0xf0,0x7f,0x01,0x0d,0xd1,0x63,0x7a,0x99,0x06,0x44,0xbf,0x02,0x21,0x01,0x70,0x13,0xf0,0x40,0x0f,0x03,0x78,0x14,0xbf,0x23,0xf0,0x01,0x03,0x43,0xf0,0x01
,0x03,0x14,0xe0,0x01,0x29,0x20,0xd0,0x02,0x29,0x1d,0xd1,0x21,0x79,0x01,0xf0,0x0f,0x03,0x9b,0x00,0x03,0xf1,0x80,0x43,0x03,0xf5,0xb8,0x43,0x11,0xf0,0x80,0x0f,0x1b
,0x68,0x06,0xd0,0x03,0xf0,0x30,0x03,0x10,0x2b,0x07,0xd1,0x01,0x23,0x13,0x70,0x04,0xe0,0x03,0xf4,0x40,0x53,0xb3,0xf5,0x80,0x5f,0xf6,0xe7,0x05,0x4b,0x1b,0x68,0x1b
,0x69,0x98,0x47,0x02,0x48,0x10,0xbd,0x18,0x46,0x10,0xbd,0x04,0x03,0x00,0x20,0x0a,0x03,0x00,0x20,0x00,0x03,0x00,0x20,0x2d,0xe9,0xf8,0x43,0x23,0x4f,0xdf,0xf8,0xa0
,0x80,0x3c,0x68,0x23,0x8a,0xbb,0xb9,0x26,0x7a,0x04,0x2e,0x14,0xd1,0x20,0x48,0x02,0x78,0x01,0x2a,0x0b,0xd1,0x1f,0x4a,0x11,0x68,0x1f,0x4a,0x89,0xb2,0x0a,0x44,0x52
,0x00,0x13,0x60,0x30,0x22,0xa8,0xf8,0x00,0x20,0x03,0x70,0x29,0xe0,0x10,0x23,0xa8,0xf8,0x00,0x30,0x07,0x26,0x24,0xe0,0xa5,0x8a,0xab,0x42,0x94,0xbf,0x04,0x26,0x02
,0x26,0x9d,0x42,0x28,0xbf,0x1d,0x46,0xa3,0x69,0x28,0x46,0x98,0x47,0x81,0x46,0x00,0x20,0xff,0xf7,0x87,0xfe,0x2a,0x46,0x01,0x46,0x48,0x46,0x00,0xf0,0x72,0xfb,0x29
,0x46,0x00,0x20,0xff,0xf7,0x42,0xfe,0x23,0x8a,0x4f,0xf4,0x40,0x52,0x5b,0x1b,0x23,0x82,0x63,0x8a,0x1d,0x44,0x30,0x23,0xa8,0xf8,0x00,0x30,0x07,0x4b,0x65,0x82,0x1a
,0x80,0x3b,0x68,0x1e,0x72,0xbd,0xe8,0xf8,0x83,0x00,0xbf,0x04,0x03,0x00,0x20,0x24,0x0b,0x00,0x20,0x50,0x5c,0x00,0x40,0x02,0x30,0x00,0x20,0xd2,0x02,0x00,0x20,0xd4
,0x02,0x00,0x20,0x10,0xb5,0x0a,0x4b,0x0a,0x49,0x1b,0x68,0x49,0x78,0x9a,0x78,0x91,0x42,0x0a,0xd3,0xd9,0x78,0x41,0xb9,0x9c,0x88,0x34,0xb9,0x9a,0x72,0x06,0x4b,0x1b
,0x68,0x5b,0x68,0x98,0x47,0x20,0x46,0x10,0xbd,0x02,0x20,0x10,0xbd,0x00,0xbf,0x04,0x03,0x00,0x20,0x90,0x00,0x00,0x20,0x00,0x03,0x00,0x20,0x38,0xb5,0x0e,0x4a,0x0e
,0x4d,0x12,0x68,0x2b,0x68,0x92,0x69,0x99,0x78,0x18,0x79,0x90,0x47,0x2b,0x68,0x9a,0x7a,0x7a,0xb1,0x70,0xb9,0x5a,0x79,0x62,0xb9,0xdc,0x78,0x54,0xb9,0x08,0x4b,0x1b
,0x68,0xdb,0x68,0x98,0x47,0x2b,0x68,0x20,0x46,0x1a,0x79,0xda,0x72,0x9a,0x78,0x1a,0x73,0x38,0xbd,0x02,0x20,0x38,0xbd,0xdc,0x02,0x00,0x20,0x04,0x03,0x00,0x20,0x00
,0x03,0x00,0x20,0x38,0xb5,0x2e,0x4b,0x1b,0x68,0x18,0x78,0x10,0xf0,0x7f,0x00,0x04,0xd1,0x5a,0x7a,0x22,0xf0,0x20,0x02,0x5a,0x72,0x38,0xbd,0x02,0x28,0x4d,0xd1,0x5a
,0x88,0x00,0x2a,0x4b,0xd1,0x5a,0x79,0x00,0x2a,0x48,0xd1,0x19,0x79,0x25,0x4d,0x21,0xf0,0x80,0x00,0x84,0x00,0x04,0xf1,0x80,0x42,0x02,0xf5,0xb8,0x42,0x12,0x68,0x2d
,0x78,0x11,0xf0,0x80,0x0f,0x14,0xbf,0x02,0xf0,0x30,0x02,0x02,0xf4,0x40,0x52,0xa8,0x42,0x33,0xd2,0x92,0xb3,0x9b,0x7a,0x83,0xb3,0x04,0xf1,0x80,0x44,0x04,0xf5,0xb8
,0x44,0x0a,0x06,0x23,0x68,0x0c,0xd5,0x03,0xf0,0x30,0x03,0x10,0x2b,0x1f,0xd1,0xc4,0xb2,0x20,0x46,0xff,0xf7,0x9a,0xfd,0x30,0x21,0x20,0x46,0xff,0xf7,0x52,0xfd,0x16
,0xe0,0x03,0xf4,0x40,0x53,0xb3,0xf5,0x80,0x5f,0x11,0xd1,0x28,0xb9,0x0e,0x4b,0x93,0xf8,0x30,0x10,0xff,0xf7,0xa8,0xfd,0x01,0xe0,0xff,0xf7,0x77,0xfd,0x23,0x68,0x23
,0xf4,0x80,0x43,0x23,0xf0,0x70,0x03,0x9b,0xb2,0x83,0xf4,0x40,0x53,0x23,0x60,0x06,0x4b,0x1b,0x68,0x5b,0x69,0x98,0x47,0x00,0x20,0x38,0xbd,0x02,0x20,0x38,0xbd,0x04
,0x03,0x00,0x20,0x90,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x03,0x00,0x20,0x38,0xb5,0x1d,0x4b,0x1d,0x4d,0x18,0x68,0x2d,0x78,0x01,0x79,0x21,0xf0,0x80,0x04,0xa3
,0x00,0x03,0xf1,0x80,0x42,0x02,0xf5,0xb8,0x42,0x12,0x68,0x11,0xf0,0x80,0x0f,0x14,0xbf,0x02,0xf0,0x30,0x02,0x02,0xf4,0x40,0x52,0xac,0x42,0x21,0xd2,0x44,0x88,0xfc
,0xb9,0xf2,0xb1,0x82,0x7a,0xe2,0xb1,0x03,0xf1,0x80,0x43,0x03,0xf5,0xb8,0x43,0x1a,0x68,0x09,0x06,0x4b,0xbf,0x22,0xf4,0xe0,0x42,0x22,0xf4,0x80,0x42,0x22,0xf0,0x40
,0x02,0x22,0xf0,0x70,0x02,0x4b,0xbf,0x92,0xb2,0x92,0xb2,0x82,0xf0,0x10,0x02,0x82,0xf4,0x80,0x52,0x1a,0x60,0x06,0x4b,0x1b,0x68,0x9b,0x69,0x98,0x47,0x00,0x20,0x38
,0xbd,0x02,0x20,0x38,0xbd,0x00,0xbf,0x04,0x03,0x00,0x20,0x90,0x00,0x00,0x20,0x00,0x03,0x00,0x20,0x08,0xb5,0x06,0x4b,0x1a,0x68,0x53,0x7a,0x43,0xf0,0x20,0x03,0x53
,0x72,0x04,0x4b,0x1b,0x68,0xdb,0x69,0x98,0x47,0x00,0x20,0x08,0xbd,0x00,0xbf,0x04,0x03,0x00,0x20,0x00,0x03,0x00,0x20,0x05,0x4b,0x10,0xb5,0x1c,0x68,0x62,0x8a,0x18
,0xb9,0x8b,0x88,0x9b,0x1a,0x23,0x82,0x10,0xbd,0x08,0x68,0x10,0x44,0x10,0xbd,0x04,0x03,0x00,0x20,0x08,0xb5,0x0b,0x4b,0x00,0x20,0x93,0xf8,0x30,0x10,0xff,0xf7,0x23
,0xfd,0x09,0x4b,0x1b,0x68,0x18,0x7a,0x08,0x28,0x06,0xd1,0x07,0x4b,0x4f,0xf4,0x80,0x52,0x1a,0x80,0x06,0x4b,0x10,0x22,0x1a,0x80,0xa0,0xf1,0x09,0x03,0x58,0x42,0x58
,0x41,0x08,0xbd,0x00,0x00,0x00,0x20,0x04,0x03,0x00,0x20,0xd2,0x02,0x00,0x20,0xd4,0x02,0x00,0x20,0x73,0xb5,0x9d,0x4d,0x9d,0x4e,0x2b,0x68,0x31,0x68,0x1a,0x7a,0x09
,0x2a,0x13,0xd0,0x9b,0x4a,0x89,0xb2,0x0a,0x44,0x52,0x00,0x12,0x88,0x52,0x00,0x02,0xf1,0x80,0x42,0x02,0xf5,0xc0,0x42,0x11,0x78,0x19,0x70,0x51,0x78,0x59,0x70,0x91
,0x88,0x59,0x80,0x11,0x89,0x99,0x80,0x92,0x89,0xda,0x80,0x01,0x22,0x1a,0x72,0xda,0x88,0x5c,0x78,0x00,0x2a,0x59,0xd1,0x1a,0x78,0x12,0xf0,0x7f,0x02,0x3b,0xd1,0x09
,0x2c,0x02,0xd1,0xff,0xf7,0xae,0xfe,0x45,0xe0,0x05,0x2c,0x10,0xd1,0x93,0xf9,0x02,0x20,0x00,0x2a,0x01,0xda,0x08,0x23,0x45,0xe0,0xda,0x78,0x00,0x2a,0xfa,0xd1,0x9a
,0x88,0x00,0x2a,0xf7,0xd1,0x9b,0x7a,0x00,0x2b,0x00,0xf0,0x19,0x81,0xf2,0xe7,0x03,0x2c,0x13,0xd1,0x9a,0x78,0x01,0x2a,0x07,0xd0,0x7f,0x4b,0x20,0x46,0x1b,0x68,0x5b
,0x69,0x98,0x47,0x03,0x28,0x2a,0xd1,0x2c,0xe0,0x9a,0x88,0x00,0x2a,0xf4,0xd1,0x5b,0x7a,0x98,0x06,0xf1,0xd5,0xff,0xf7,0x6d,0xff,0x1c,0xe0,0x01,0x2c,0xec,0xd1,0x9a
,0x78,0x01,0x2a,0xe9,0xd1,0x9a,0x88,0x00,0x2a,0xe6,0xd1,0x5b,0x7a,0x99,0x06,0xe3,0xd5,0xff,0xf7,0xb7,0xfe,0x0e,0xe0,0x01,0x2a,0x04,0xd1,0x0b,0x2c,0xdc,0xd1,0xff
,0xf7,0x8c,0xfe,0x07,0xe0,0x02,0x2a,0xd7,0xd1,0x01,0x2c,0xf1,0xd0,0x03,0x2c,0xd3,0xd1,0xff,0xf7,0x0d,0xff,0x00,0x28,0x00,0xf0,0xe2,0x80,0xcd,0xe7,0x00,0x28,0xb9
,0xd1,0xdd,0xe0,0x09,0x23,0x2a,0x68,0x13,0x72,0xd5,0xe0,0x06,0x2c,0x1a,0xd1,0x1a,0x78,0x52,0x06,0x40,0xf0,0xe2,0x80,0xda,0x78,0x5f,0x4b,0x01,0x2a,0x02,0xd1,0x1b
,0x68,0xdb,0x69,0x76,0xe0,0x02,0x2a,0x02,0xd1,0x1b,0x68,0x1b,0x6a,0x71,0xe0,0x03,0x2a,0x02,0xd1,0x1b,0x68,0x5b,0x6a,0x6c,0xe0,0x21,0x2a,0x40,0xf0,0xce,0x80,0x1b
,0x68,0x9b,0x6a,0x66,0xe0,0x00,0x2c,0x40,0xd1,0x59,0x88,0x00,0x29,0x40,0xf0,0xc5,0x80,0x5a,0x68,0x22,0xf0,0xff,0x02,0xb2,0xf5,0x00,0x3f,0x40,0xf0,0xbe,0x80,0x1a
,0x78,0x12,0xf0,0x7f,0x02,0x04,0xd1,0x9b,0x88,0x00,0x2b,0x00,0xf0,0xb4,0x80,0xb4,0xe0,0x01,0x2a,0x0a,0xd1,0x48,0x4a,0x18,0x79,0x12,0x68,0x92,0x69,0x90,0x47,0x00
,0x28,0x40,0xf0,0xab,0x80,0x2b,0x68,0x9b,0x7a,0x1b,0xe0,0x02,0x2a,0x40,0xf0,0xa5,0x80,0x1a,0x79,0x41,0x48,0x02,0xf0,0x0f,0x01,0x8b,0x00,0x03,0xf1,0x80,0x43,0x03
,0xf5,0xb8,0x43,0x1b,0x68,0x00,0x78,0x12,0xf0,0x80,0x0f,0x14,0xbf,0x03,0xf0,0x30,0x03,0x03,0xf4,0x40,0x53,0x81,0x42,0x80,0xf0,0x90,0x80,0x12,0xf0,0x70,0x0f,0x40
,0xf0,0x8c,0x80,0x00,0x2b,0x40,0xf0,0x87,0x80,0x87,0xe0,0x08,0x2c,0x05,0xd1,0x1b,0x78,0x5b,0x06,0x40,0xf0,0x82,0x80,0x31,0x4b,0x1d,0xe0,0x0a,0x2c,0x7d,0xd1,0x1a
,0x78,0x02,0xf0,0x7f,0x02,0x01,0x2a,0x78,0xd1,0x9a,0x7a,0x00,0x2a,0x75,0xd0,0x59,0x88,0x00,0x29,0x72,0xd1,0x5a,0x68,0x22,0xf0,0xff,0x02,0xb2,0xf5,0x80,0x3f,0x6c
,0xd1,0x25,0x4a,0x18,0x79,0x12,0x68,0x92,0x69,0x90,0x47,0x00,0x28,0x65,0xd1,0x24,0x4b,0x01,0xe0,0x00,0x2b,0x61,0xd0,0x2a,0x68,0x00,0x24,0x54,0x82,0x93,0x61,0x20
,0x46,0x98,0x47,0x20,0x46,0x4f,0xf6,0xff,0x71,0x2b,0x68,0x1a,0x8a,0x8a,0x42,0x01,0xd1,0x09,0x22,0x03,0xe0,0x02,0x28,0x00,0xd0,0x12,0xb9,0x08,0x22,0x1a,0x72,0x3a
,0xe0,0x93,0xf9,0x00,0x10,0x00,0x29,0x30,0xda,0xd9,0x88,0x12,0x4c,0x01,0x91,0x01,0x98,0x82,0x42,0x02,0xd9,0x01,0x9a,0x1a,0x82,0x10,0xe0,0x8a,0x42,0x0e,0xd2,0x21
,0x68,0x91,0xf8,0x30,0x00,0x82,0x42,0x01,0xd2,0x00,0x21,0x05,0xe0,0x92,0xfb,0xf0,0xf1,0x00,0xfb,0x11,0x22,0x12,0xb9,0x01,0x21,0x0b,0x4a,0x11,0x70,0x22,0x68,0x92
,0xf8,0x30,0x20,0x9a,0x82,0xff,0xf7,0x47,0xfd,0x15,0xe0,0x04,0x03,0x00,0x20,0x50,0x5c,0x00,0x40,0x04,0x30,0x00,0x20,0xdc,0x02,0x00,0x20,0x90,0x00,0x00,0x20,0xa1
,0x10,0x00,0x08,0xc5,0x10,0x00,0x08,0x24,0x0b,0x00,0x20,0x03,0x22,0x1a,0x72,0x10,0x4b,0x4f,0xf4,0x40,0x52,0x1a,0x80,0xff,0xf7,0x8c,0xfe,0x02,0xb0,0x70,0xbd,0x32
,0x68,0x0d,0x4b,0x92,0xb2,0x13,0x44,0x5b,0x00,0x00,0x22,0x1a,0x60,0x0b,0x4b,0x30,0x22,0x1a,0x80,0x06,0x23,0x16,0xe7,0x09,0x4b,0x9d,0xe7,0x09,0x4b,0x2a,0x68,0x1b
,0x68,0x50,0x78,0x1b,0x69,0x98,0x47,0x03,0x28,0x9c,0xd1,0x06,0x4b,0x1b,0x68,0x9f,0xe7,0x00,0xbf,0xd2,0x02,0x00,0x20,0x02,0x30,0x00,0x20,0xd4,0x02,0x00,0x20,0xe9
,0x10,0x00,0x08,0xdc,0x02,0x00,0x20,0x04,0x03,0x00,0x20,0xf8,0xb5,0x2a,0x4d,0x2c,0x68,0x23,0x7a,0x03,0x2b,0x01,0xd0,0x05,0x2b,0x3f,0xd1,0xa1,0x69,0x26,0x8a,0xa9
,0xb1,0xa6,0xb1,0xa3,0x8a,0x9e,0x42,0x28,0xbf,0x1e,0x46,0x30,0x46,0x88,0x47,0x23,0x8a,0x07,0x46,0x9b,0x1b,0x23,0x82,0x63,0x8a,0x00,0x20,0x33,0x44,0x63,0x82,0xff
,0xf7,0xb0,0xfb,0x32,0x46,0x01,0x46,0x38,0x46,0x00,0xf0,0x9d,0xf8,0x23,0x8a,0x53,0xb1,0x1a,0x4b,0x00,0x21,0x4f,0xf4,0x40,0x52,0x08,0x46,0x1a,0x80,0xff,0xf7,0x55
,0xfb,0x17,0x4b,0x30,0x22,0x1a,0x80,0xa3,0x8a,0x22,0x8a,0x93,0x42,0x2b,0x68,0x01,0xd8,0x03,0x22,0x01,0xe0,0x12,0xb1,0x05,0x22,0x1a,0x72,0x0b,0xe0,0x06,0x21,0x19
,0x72,0x10,0x4b,0x19,0x68,0x10,0x4b,0x89,0xb2,0x0b,0x44,0x5b,0x00,0x1a,0x60,0x0b,0x4b,0x30,0x22,0x1a,0x80,0x2b,0x68,0x1b,0x7a,0x06,0xe0,0x07,0x2b,0x03,0xd1,0x0a
,0x4b,0x1b,0x68,0xdb,0x68,0x98,0x47,0x08,0x23,0x2a,0x68,0x13,0x72,0xbd,0xe8,0xf8,0x40,0xff,0xf7,0x0f,0xbe,0x00,0xbf,0x04,0x03,0x00,0x20,0xd2,0x02,0x00,0x20,0xd4
,0x02,0x00,0x20,0x50,0x5c,0x00,0x40,0x02,0x30,0x00,0x20,0xdc,0x02,0x00,0x20,0x30,0xb5,0x0b,0x4b,0x00,0x22,0x1c,0x78,0xa2,0x42,0x0c,0xd2,0x48,0xf6,0x8f,0x71,0x02
,0xf1,0x80,0x53,0x03,0xf5,0xb8,0x53,0x9b,0x00,0x1d,0x68,0x29,0x40,0x11,0x43,0x19,0x60,0x01,0x32,0xf0,0xe7,0x03,0x4b,0x40,0xf0,0x80,0x00,0x18,0x60,0x30,0xbd,0x90
,0x00,0x00,0x20,0x4c,0x5c,0x00,0x40,0x10,0xb5,0x13,0x4c,0x23,0x68,0x1a,0x7a,0x02,0x2a,0x01,0xd0,0x04,0x2a,0x04,0xd1,0xff,0xf7,0x7e,0xfc,0x23,0x68,0x1b,0x7a,0x13
,0xe0,0x06,0x2a,0x10,0xd1,0x5a,0x78,0x05,0x2a,0x09,0xd1,0x1a,0x78,0x52,0x06,0x06,0xd1,0x98,0x78,0xff,0xf7,0xcc,0xff,0x08,0x4b,0x1b,0x68,0x1b,0x6a,0x98,0x47,0x07
,0x4b,0x1b,0x68,0x9b,0x68,0x98,0x47,0x08,0x23,0x22,0x68,0x13,0x72,0xbd,0xe8,0x10,0x40,0xff,0xf7,0xbf,0xbd,0x00,0xbf,0x04,0x03,0x00,0x20,0x00,0x03,0x00,0x20,0xdc
,0x02,0x00,0x20,0x10,0xb5,0x01,0xf1,0x00,0x51,0x01,0x32,0x01,0xf5,0x40,0x51,0x52,0x10,0x49,0x00,0x00,0x23,0x9a,0x42,0x05,0xd0,0x30,0xf8,0x02,0x4b,0x21,0xf8,0x23
,0x40,0x01,0x33,0xf7,0xe7,0x10,0xbd,0x10,0xb5,0x01,0xf1,0x00,0x51,0x01,0x32,0x01,0xf5,0x40,0x51,0x52,0x10,0x49,0x00,0x00,0x23,0x9a,0x42,0x05,0xd0,0x51,0xf8,0x23
,0x40,0x20,0xf8,0x13,0x40,0x01,0x33,0xf7,0xe7,0x10,0xbd,0x51,0x04,0x00,0x08,0x65,0x01,0x00,0x08,0xd9,0x02,0x00,0x08,0xdb,0x02,0x00,0x08,0x0d,0x02,0x00,0x08,0xb1
,0x02,0x00,0x08,0x33,0x01,0x00,0x08,0x6d,0x02,0x00,0x08,0x79,0x02,0x00,0x08,0x85,0x02,0x00,0x08,0xa5,0x02,0x00,0x08,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xd7
,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7
,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xd7,0x02,0x00,0x08,0xdd,0x02,0x00,0x08,0x3d,0x01,0x00,0x08,0xdf
,0x02,0x00,0x08,0xe1,0x02,0x00,0x08,0xe3,0x02,0x00,0x08,0xe5,0x02,0x00,0x08,0xd5,0x02,0x00,0x08,0x55,0x01,0x00,0x08,0x59,0x01,0x00,0x08,0x01,0x01,0x00,0x00,0xe8
,0x00,0x00,0x20,0x04,0x00,0x00,0x00,0x32,0x01,0x00,0x20,0x12,0x00,0x00,0x00,0x4c,0x01,0x00,0x20,0x14,0x00,0x00,0x00,0x19,0x01,0x00,0x20,0x10,0x00,0x00,0x00,0x60
,0x01,0x00,0x20,0x80,0x00,0x00,0x00,0xe0,0x01,0x00,0x20,0x6c,0x00,0x00,0x00,0x4c,0x02,0x00,0x20,0x6c,0x00,0x00,0x00,0x12,0x01,0x00,0x01,0x00,0x00,0x00,0x40,0xaf
,0x1e,0x03,0x00,0x01,0x02,0x01,0x02,0x03,0x01,0x00,0x00,0x29,0x01,0x00,0x20,0x09,0x00,0x00,0x00,0x04,0x03,0x09,0x04,0x09,0x02,0x2d,0x00,0x01,0x01,0x00,0x80,0x32
,0x09,0x04,0x00,0x00,0x00,0xfe,0x01,0x02,0x04,0x09,0x04,0x00,0x01,0x00,0xfe,0x01,0x02,0x05,0x09,0x04,0x00,0x02,0x00,0xfe,0x01,0x02,0x06,0x09,0x21,0x03,0xff,0x00
,0x00,0x08,0x10,0x01,0x10,0x03,0x4c,0x00,0x4c,0x00,0x4d,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x09,0x21,0x03,0xff,0x00,0x00,0x08,0x10,0x01,0x12,0x03,0x4c
,0x00,0x65,0x00,0x61,0x00,0x66,0x00,0x4c,0x00,0x61,0x00,0x62,0x00,0x73,0x00,0xcc,0x00,0x00,0x20,0x12,0x00,0x00,0x00,0x14,0x03,0x4d,0x00,0x61,0x00,0x70,0x00,0x6c
,0x00,0x65,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x80,0x03,0x53,0x00,0x54,0x00,0x4d,0x00,0x33,0x00,0x32,0x00,0x64,0x00,0x75,0x00,0x69,0x00,0x6e,0x00,0x6f
,0x00,0x20,0x00,0x62,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x30
,0x00,0x20,0x00,0x20,0x00,0x45,0x00,0x52,0x00,0x52,0x00,0x4f,0x00,0x52,0x00,0x2e,0x00,0x20,0x00,0x55,0x00,0x70,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20
,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x52,0x00,0x41,0x00,0x4d,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6f
,0x00,0x72,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x6c,0x03,0x53,0x00,0x54,0x00,0x4d,0x00,0x33,0x00,0x32,0x00,0x64,0x00,0x75,0x00,0x69,0x00,0x6e,0x00,0x6f
,0x00,0x20,0x00,0x62,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x30
,0x00,0x20,0x00,0x20,0x00,0x55,0x00,0x70,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x46,0x00,0x6c,0x00,0x61,0x00,0x73
,0x00,0x68,0x00,0x20,0x00,0x30,0x00,0x78,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x35,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x6c,0x03,0x53,0x00,0x54,0x00,0x4d,0x00,0x33
,0x00,0x32,0x00,0x64,0x00,0x75,0x00,0x69,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,0x62,0x00,0x6f,0x00,0x6f,0x00,0x74,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x65
,0x00,0x72,0x00,0x20,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x55,0x00,0x70,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74
,0x00,0x6f,0x00,0x20,0x00,0x46,0x00,0x6c,0x00,0x61,0x00,0x73,0x00,0x68,0x00,0x20,0x00,0x30,0x00,0x78,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x30
,0x00,0x30,0x00,0xec,0x00,0x00,0x20,0x2d,0x00,0x00,0x00,0x00,0x50,0x00,0x20,0x00,0x0c,0x00,0x20};

#define BOARD_LED_PIN 33


typedef struct {
  volatile uint32 CR;
  volatile uint32 CFGR;
  volatile uint32 CIR;
  volatile uint32 APB2RSTR;
  volatile uint32 APB1RSTR;
  volatile uint32 AHBENR;
  volatile uint32 APB2ENR;
  volatile uint32 APB1ENR;
  volatile uint32 BDCR;
  volatile uint32 CSR;
} RCC_RegStruct;

typedef enum { RESET = 0, SET   = !RESET } FlagStatus, ITStatus;

typedef enum { DISABLE = 0, ENABLE  = !DISABLE} FunctionalState;

typedef enum { ERROR = 0, SUCCESS  = !ERROR} ErrorStatus;

#define BOOTLOADER_FLASH   ((uint32)0x08000000)
#define PAGE_SIZE          1024

#define SET_REG(addr,val) do { *(volatile uint32*)(addr)=val; } while(0)
#define GET_REG(addr)     (*(volatile uint32*)(addr))


#define RCC   ((uint32)0x40021000)
#define FLASH ((uint32)0x40022000)

#define RCC_CR      RCC
#define RCC_CFGR    (RCC + 0x04)
#define RCC_CIR     (RCC + 0x08)
#define RCC_AHBENR  (RCC + 0x14)
#define RCC_APB2ENR (RCC + 0x18)
#define RCC_APB1ENR (RCC + 0x1C)

#define FLASH_ACR     (FLASH + 0x00)
#define FLASH_KEYR    (FLASH + 0x04)
#define FLASH_OPTKEYR (FLASH + 0x08)
#define FLASH_SR      (FLASH + 0x0C)
#define FLASH_CR      (FLASH + 0x10)
#define FLASH_AR      (FLASH + 0x14)
#define FLASH_OBR     (FLASH + 0x1C)
#define FLASH_WRPR    (FLASH + 0x20)

#define FLASH_KEY1     0x45670123
#define FLASH_KEY2     0xCDEF89AB
#define FLASH_RDPRT    0x00A5
#define FLASH_SR_BSY   0x01
#define FLASH_CR_PER   0x02
#define FLASH_CR_PG    0x01
#define FLASH_CR_START 0x40

#define pRCC ((RCC_RegStruct *) RCC)



bool flashErasePage(uint32 pageAddr) {
  uint32 rwmVal = GET_REG(FLASH_CR);
  rwmVal = FLASH_CR_PER;
  SET_REG(FLASH_CR, rwmVal);

  while (GET_REG(FLASH_SR) & FLASH_SR_BSY) {}
  SET_REG(FLASH_AR, pageAddr);
  SET_REG(FLASH_CR, FLASH_CR_START | FLASH_CR_PER);
  while (GET_REG(FLASH_SR) & FLASH_SR_BSY) {}

  /* todo: verify the page was erased */

  rwmVal = 0x00;
  SET_REG(FLASH_CR, rwmVal);

  return true;
}
bool flashErasePages(uint32 pageAddr, uint16 n) {
  while (n-- > 0) {
    if (!flashErasePage(pageAddr + 0x400 * n)) {
      return false;
    }
  }

  return true;
}

bool flashWriteWord(uint32 addr, uint32 word) {
  volatile uint16 *flashAddr = (volatile uint16 *)addr;
  volatile uint32 lhWord = (volatile uint32)word & 0x0000FFFF;
  volatile uint32 hhWord = ((volatile uint32)word & 0xFFFF0000) >> 16;

  uint32 rwmVal = GET_REG(FLASH_CR);
  SET_REG(FLASH_CR, FLASH_CR_PG);

  /* apparently we need not write to FLASH_AR and can
     simply do a native write of a half word */
  while (GET_REG(FLASH_SR) & FLASH_SR_BSY) {}
  *(flashAddr + 0x01) = (volatile uint16)hhWord;
  while (GET_REG(FLASH_SR) & FLASH_SR_BSY) {}
  *(flashAddr) = (volatile uint16)lhWord;
  while (GET_REG(FLASH_SR) & FLASH_SR_BSY) {}

  rwmVal &= 0xFFFFFFFE;
  SET_REG(FLASH_CR, rwmVal);

  /* verify the write */
  if (*(volatile uint32 *)addr != word) {
    return false;
  }

  return true;
}

void flashLock() {
  /* take down the HSI oscillator? it may be in use elsewhere */

  /* ensure all FPEC functions disabled and lock the FPEC */
  SET_REG(FLASH_CR, 0x00000080);
}

void flashUnlock() {
  /* unlock the flash */
  SET_REG(FLASH_KEYR, FLASH_KEY1);
  SET_REG(FLASH_KEYR, FLASH_KEY2);
}

/* Minimum_Source*/

void setupFLASH() {
  /* configure the HSI oscillator */
  if ((pRCC->CR & 0x01) == 0x00) {
    uint32 rwmVal = pRCC->CR;
    rwmVal |= 0x01;
    pRCC->CR = rwmVal;
  }

  /* wait for it to come on */
  while ((pRCC->CR & 0x02) == 0x00) {}
}

bool writeChunk(uint32 *ptr, int size, const char *data)
{
  flashErasePage((uint32)(ptr));

  for (int i = 0; i < size; i = i + 4) {
    if (!flashWriteWord((uint32)(ptr++), *((uint32 *)(data + i)))) {
      return false;
    }
  }

  return true;
}

bool isNewBootloaderAlreadyInstalled()
{
  char *existingBootloader = (char *) BOOTLOADER_FLASH;
  int bootloaderSize=sizeof(maple_mini_boot20);

  for(int i=0;i<bootloaderSize;i++)
  {
    if (  maple_mini_boot20[i]!= *(existingBootloader+i))
    {
      return false;
    }
  }
  return true;
}

void setup()
{
  char * bootloader = const_cast<char *>(maple_mini_boot20);
  int n = 0;
  bool alreadyInstalled = isNewBootloaderAlreadyInstalled();

  pinMode(BOARD_LED_PIN, OUTPUT);

  Serial.begin(9600);
  // Wait for the user to open the serial window.
  while (!(Serial.isConnected() && (Serial.getDTR() )))
  {
    digitalWrite(BOARD_LED_PIN, !digitalRead(BOARD_LED_PIN));
    delay(1000); // Slow blink
  }

  if (alreadyInstalled)
  {
    Serial.print("Congratulations. You have already updated to this version of the bootloader");
    while(1);
  }


  digitalWrite(BOARD_LED_PIN, LOW);
  Serial.println ("**************************************************************************************************");
  Serial.println ("*** This sketch will update the bootloader in the Maple Mini to the STM32duino bootloader     ****");
  Serial.println ("*** With this you can use up to 120KB of Flash and 20KB of RAM for a Sketch                   ****");
  Serial.println ("*** Uploading is also considerably faster on OSX (and possibly faster on Linux)               ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                      Only use with Maple mini boards                                      ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("*** WARNING. If the update fails your Maple mini may not have a functional bootloder.         ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                            YOU UPDATE AT YOUR OWN RISK                                    ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("**************************************************************************************************");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                                                                                           ****");
  Serial.println ("***                         To confirm and proceed, enter Y                                   ****");
  Serial.println ("***                                                                                           ****");

  while (Serial.read() != 'Y')
  {
    delay(1);
  }

  Serial.println ("***                                                                                           ****");

  n = sizeof(maple_mini_boot20);

  setupFLASH();
  flashUnlock();

  int success = 1;
  int pages = n/PAGE_SIZE;
  int currentPage=1;
  for (int i = 0; i < n; i += PAGE_SIZE)
  {
    int size = 0;
    uint32* chunk = (uint32 *)(BOOTLOADER_FLASH + i);

    size = n - i;
    if (size > PAGE_SIZE)
    {
      size = PAGE_SIZE;
    }

    if (!writeChunk(chunk, size, &bootloader[i]))
    {
      Serial.println ();
      Serial.println ("WARNING, Update Failed!! The sketch will restart in 3 seconds and you can try to flash again");
      delay (3000);
      success = 0;
      break;
    }
    Serial.print("Writing flash page ");Serial.print(currentPage++);Serial.print(" of ");Serial.println(pages+1);
  }

  if (success)
  {
    flashLock();
    Serial.println ();
    Serial.println ("Update completed successfully. - Please test by uploading a different sketch");
    while (1) {
      digitalWrite(BOARD_LED_PIN, LOW);
      delay(500);
      digitalWrite(BOARD_LED_PIN, HIGH);
      delay(500);
    }
  }
}

void loop(){}

